﻿using System;

namespace Lesson15_继承_万物之父与装箱拆箱
{
    class Father
    {

    }
    class Son : Father
    {
        public void Fun()
        {
            Console.WriteLine("Son方法");
        }
    }
    #region 一 基本概念
    //关键字: object
    //概念：
    //object是所有类型的基类，它是一个类(引用类型)
    //作用：
    //1.基于里氏替换原则，用object容器装载所有对象
    //2.可以用来表示不确定类型，作为函数参数的类型
    #endregion
    class Program
    {
        static void Main(string[] args)
        {
            #region 二 万物之父的使用
            //引用类型
            object o1 = new Son();
            if (o1 is Son)
            {
                (o1 as Son).Fun();
            }
            //值类型
            object o2 = 1;
            o2 = 3.14f;
            //强转
            float f = (float)o2;
            //string类型和数组类型(建议使用as)
            object str = "123456";
            string s1 = str.ToString();
            string s2 = str as string;

            object arr = new int[10];
            int[] ar1 = (int[])arr;
            int[] ar2 = arr as int[];
            //总结：
            //值类型用强转
            //引用类型用as
            #endregion

            #region 三 装箱拆箱
            //发生条件
            //用object装载值类型（装箱），如：object o = 3.14f;
            //再把object转为值类型（拆箱），如：float f = (float)o;
            //注意是值类型!!!

            //装箱：
            //把值类型用引用类型存储
            //将栈内存迁移至堆内存中

            //拆箱：
            //取出引用类型中存储的值类型
            //堆内存迁移至栈内存中

            //好处：不确定类型时 可以方便参数的存储和传递
            //坏处：存在内存迁移，会增加性能消耗

            //举例：
            //装箱
            object value = 1;
            //拆箱
            int intvalue = (int)value;
            #endregion

            //可以传入任意类型参数
            TestFun(1, 2.0, 3.3f, "123", new int[3], new Son());
        }
        //装箱拆箱具体应用举例
        static void TestFun(params object[] array)
        {
            //这样参数就可以传任意类型
        }
    }
}